perm filename INVIMA[EKL,SYS] blob sn#864135 filedate 1988-08-05 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00013 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	(wipe-out)
C00004 00003	PROOFS
C00005 00004	(proof pigeonfacts)
C00015 00005	(proof uniqueness_alist)
C00016 00006	(proof invimage_lemmata)
C00018 00007	nth range
C00022 00008	nth dom:
C00026 00009	(proof nthcdr_dom)
C00028 00010	(proof member_memberdom)
C00031 00011	(proof invimage)
C00039 00012
C00050 00013
C00053 ENDMK
C⊗;
(wipe-out)
(get-proofs pigeon prf ekl sys)

;(label dijpair_def sums#10)
;(label disjointdef sums#12)

(proof alistfacts)

(axiom |∀alist.length (dom(alist))=length alist|)
(label domlength)

(define invimage |∀n alist.invimage(n,alist)=
                           (λxv.atom xv∧∃y.member(xv.y,alist)∧(setseq(n))(y))|)

(axiom |∀chi3.(∀alist n xa y.chi3(nil,n)∧chi3(alist,0)∧
                             (chi3(alist,n)⊃chi3((xa.y).alist,n')))⊃
              (∀alist n.chi3(alist,n))|)
(label double_alistinduction1)

(axiom |∀alist n.n<length dom(alist)⊃atom(nth(dom alist,n))|)
(label atom_nth)

(axiom |∀alist n.uniqueness(dom(alist))∧n<length (dom(alist))⊃
                 appalist(nth(dom(alist),n),alist)=nth(range(alist),n)|)
(label appalist_nth)
;PROOFS
(proof pigeonfacts)

(axiom |∀x u.alistp(x.u)⊃¬atom x∧atom car x∧alistp u|)
(label alistfact1)

(axiom |∀x u.alistp(x.u)⊃alistp u|)
(label alistfact2)

(axiom |∀u n.alistp u⊃alistp nthcdr(u,n)|)
(label alist_nthcdr)

(axiom |∀u n.alistp u∧n<length u⊃¬atom nth(u,n)∧atom car nth(u,n)|)
(label nthalist_sort)

(axiom |∀u n.alistp u∧n<length u⊃cdr nth(u,n)=nth(range(u),n)|)
(label nth_range)

(axiom |∀u n.alistp u∧n<length u⊃car nth(u,n)=nth(dom(u),n)|)
(label nth_dom)

(axiom |∀setseq n.un(λm.setseq(m),n)=(λx.∃k.k<n∧(setseq k)(x))|)
(label unionfact2)

(axiom |∀alist x y.cdr assoc(x,alist)=y⊃assoc(x,alist)=x.y|)
(label assocfact1)

(axiom |∀u n.alistp u⊃nthcdr(dom(u),n)=dom(nthcdr(u,n))|)
(label nthcdr_dom)

(axiom |∀alist xa1 y1.member(xa1.y1,alist)⊃member(xa1,dom(alist))|)
(label member_memberdom)

;theorem 
(axiom |(∀n.n<length alist⊃disjoint(λm.setseq(m),n'))∧
        inj(dom(alist))⊃
        (∀n.n≤length alist⊃disjoint(λm.invimage(m,alist),n))|)
(label disjoint_invimage)
(proof uniqueness_alist)

(trw |∀x y.x=y⊃car(x)=car(y)|)
;∀X Y.X=Y⊃CAR X=CAR Y

(ue ((x.|xa.y|)(y.|xa1.y1|)) *)
;XA.Y=XA1.Y1⊃XA=XA1

(ue (chi |λalist.member(xa.y,alist)⊃member(xa,dom alist)|) alistinduction
    (open member dom) (use normal * mode: always))
;∀ALIST.MEMBER(XA.Y,ALIST)⊃MEMBER(XA,DOM(ALIST))

(derive |∀alist xa y.¬member(xa,dom(alist))⊃¬member(xa.y,alist)| *)

(ue (chi |λalist.uniqueness dom(alist)⊃uniqueness alist|) alistinduction
    (open dom uniqueness member) *)
;∀ALIST.UNIQUENESS(DOM(ALIST))⊃UNIQUENESS(ALIST)
(label uniqueness_dom_alist)

(proof invimage_lemmata)
;uniqueness nthcdr

(ue (phi3 |λu n.uniqueness u⊃uniqueness nthcdr(u,n)|) doubleinduction1 
    (open uniqueness nthcdr))
;∀U N.UNIQUENESS(U)⊃UNIQUENESS(NTHCDR(U,N))
(label uniqueness_nthcdr)

;alistp nthcdr

(ue (phi3 |λu n.alistp u⊃alistp nthcdr(u,n)|) doubleinduction1 alistfact2)
;∀U N.ALISTP U⊃ALISTP NTHCDR(U,N)
(label alistp_nthcdr)

;nthalist sort

(ue (phi |λu.alistp u∧0<length u⊃¬atom car u∧atom car (car u)|) 
    listinduction alistfact1)
;∀U.ALISTP U∧0<LENGTH U⊃¬ATOM CAR U∧ATOM CAR (CAR U)

(ue (phi3 |λu n.alistp u∧n<length u⊃¬atom nth(u,n)∧atom car nth(u,n)|) 
    doubleinduction1 alistfact1 *)
;∀U N.ALISTP U∧N<LENGTH U⊃¬ATOM NTH(U,N)∧ATOM CAR NTH(U,N)
(label nthalist_sort)

;nth range

(ue (phi3 |λu n.n<length u∧alistp u⊃cdr nth(u,n)=nth(range(u),n)|) 
    doubleinduction1 alistfact1 nthalist_sort (open range))
(ue (phi |λu.(0<LENGTH U∧ALISTP U⊃CDR (CAR U)=CAR RANGE(U))|) 
    listinduction alistfact1 (open range))
;(∀X U.(0<LENGTH U∧ALISTP U⊃CDR (CAR U)=CAR RANGE(U))⊃
;      (ALISTP X.U⊃CDR X=CAR RANGE(X.U)))⊃
;(∀U.0<LENGTH U∧ALISTP U⊃CDR (CAR U)=CAR RANGE(U))

(assume |0<length u|)
(label invil1)

(assume |alistp u|)
(label invil2)

(trw |sexp car(u)| invil1)
;SEXP CAR U
(label invil3)

(ue((x.|car u|)(u.|cdr u|)) alistfact1 invil1 invil2 *)
;¬ATOM CAR U∧ATOM CAR (CAR U)∧ALISTP CDR U
(label invil4)
;deps: (INVIL1 INVIL2)

(trw |car (range (((car car u).cdr car u).cdr u))|
     (nuse cons_car_cdr) (open range) invil1 invil3 *)
;CAR RANGE((CAR (CAR U).CDR (CAR U)).CDR U)=CDR (CAR U)
;deps: (INVIL1 INVIL2)

(trw |(car car(u)).(cdr car(u))| invil4)
;CAR (CAR U).CDR (CAR U)=CAR U
;deps: (INVIL1 INVIL2)

(rw -2 (use * mode: exact) invil1)
;CAR RANGE(U)=CDR (CAR U)
;deps: (INVIL1 INVIL2)

(ci (invil1 invil2))
;0<LENGTH U∧ALISTP U⊃CAR RANGE(U)=CDR (CAR U)
(label invil_basecase)

(assume |n<length u∧alistp u⊃cdr nth(u,n)=nth(range(u),n)|) 
(label invil5)

(assume |n'<length(x.u)∧alistp x.u|)
(label invil6)

(rw *)
;N<LENGTH U∧ALISTP X.U

(derive |cdr nth(u,n)=nth(range(u),n)| (* alistfact2 invil5))
(label invil7)

(derive |¬atom x∧atom car x∧alistp u| (invil6 alistfact1))

(trw |nth(range((car x.cdr x).u),n')| (nuse cons_car_cdr) (open range) *)
;NTH(RANGE((CAR X.CDR X).U),N')=NTH(RANGE(U),N)
;deps: (INVIL6)

(rw invil7 (use * mode: exact direction: reverse))
;CDR NTH(U,N)=NTH(RANGE((CAR X.CDR X).U),N')
;deps: (INVIL5 INVIL6)

(trw |car x.cdr x| -3)
;CAR X.CDR X=X
;deps: (INVIL6)

(rw -2 *)
;CDR NTH(U,N)=NTH(RANGE(X.U),N')
;deps: (INVIL5 INVIL6)

(ci invil6)
;N<LENGTH U∧ALISTP X.U⊃CDR NTH(U,N)=NTH(RANGE(X.U),N')
;deps: (INVIL5)

(ci invil5)
;(N<LENGTH U∧ALISTP U⊃CDR NTH(U,N)=NTH(RANGE(U),N))⊃
;(N<LENGTH U∧ALISTP X.U⊃CDR NTH(U,N)=NTH(RANGE(X.U),N'))
(label invil_inductioncase)

(ue (phi3 |λu n.n<length u∧alistp u⊃cdr nth(u,n)=nth(range(u),n)|) 
    doubleinduction1 invil_basecase invil_inductioncase)
;∀U N.N<LENGTH U∧ALISTP U⊃CDR NTH(U,N)=NTH(RANGE(U),N)

;nth dom:
;similarly
(proof nthdom)

(axiom |∀u n.alistp u⊃cdr nth(u,n)=nth(range(u),n)|)
(label invimage_l1)

(ue (phi3 |λu n.n<length u∧alistp u⊃cdr nth(u,n)=nth(range(u),n)|) 
    doubleinduction1 alistfact1 nthalist_sort (open range))
(ue (phi |λu.alistp u∧0<length u⊃car (car u)=car dom(u)|) 
    listinduction alistfact1 (open dom))
;(∀X U.(ALISTP U∧0<LENGTH U⊃CAR (CAR U)=CAR DOM(U))⊃
;      (ALISTP X.U⊃CAR X=CAR DOM(X.U)))⊃
;(∀U.ALISTP U∧0<LENGTH U⊃CAR (CAR U)=CAR DOM(U))

(ekl)
;(∀X U.(0<LENGTH U∧ALISTP U⊃CDR (CAR U)=CAR RANGE(U))⊃
;      (ALISTP X.U⊃CDR X=CAR RANGE(X.U)))⊃
;(∀U.0<LENGTH U∧ALISTP U⊃CDR (CAR U)=CAR RANGE(U))

(assume |0<length u|)
(label nthd1)

(assume |alistp u|)
(label nthd2)

(trw |sexp car(u)| nthd1)
;SEXP CAR U
(label nthd3)

(ue((x.|car u|)(u.|cdr u|)) alistfact1 nthd1 nthd2 *)
;¬ATOM CAR U∧ATOM CAR (CAR U)∧ALISTP CDR U
(label nthd4)

(trw |car (dom (((car car u).cdr car u).cdr u))|
     (nuse cons_car_cdr) (open dom) nthd1 nthd3 *)
;CAR DOM((CAR (CAR U).CDR (CAR U)).CDR U)=CAR (CAR U)
;deps: (NTHD1 NTHD2)

(trw |(car car(u)).(cdr car(u))| nthd4)
;CAR (CAR U).CDR (CAR U)=CAR U

(rw -2 (use * mode: exact) nthd1)
;CAR DOM(U)=CAR (CAR U)
;deps: (NTHD1 NTHD2)

(ci (nthd1 nthd2))
;0<LENGTH U∧ALISTP U⊃CAR DOM(U)=CAR (CAR U)
(label nthd_basecase)

(assume |n<length u∧alistp u⊃car nth(u,n)=nth(dom(u),n)|) 
(label nthd5)

(assume |n'<length(x.u)∧alistp x.u|)
(label nthd6)

(rw *)
;N<LENGTH U∧ALISTP X.U

(derive |car nth(u,n)=nth(dom(u),n)| (* alistfact2 nthd5))
(label nthd7)

(derive |¬atom x∧atom car x∧alistp u| (nthd6 alistfact1))

(trw |nth(dom((car x.cdr x).u),n')| (nuse cons_car_cdr) (open dom) *)
;NTH(DOM((CAR X.CDR X).U),N')=NTH(DOM(U),N)
;deps: (NTHD6)

(rw nthd7 (use * mode: exact direction: reverse))
;CAR NTH(U,N)=NTH(DOM((CAR X.CDR X).U),N')
;deps: (NTHD5 NTHD6)

(trw |car x.cdr x| -3)
;CAR X.CDR X=X
;deps: (INVIL6)

(rw -2 *)
;CAR NTH(U,N)=NTH(DOM(X.U),N')
;deps: (NTHD5 NTHD6)

(ci nthd6)
;N<LENGTH U∧ALISTP X.U⊃CAR NTH(U,N)=NTH(DOM(X.U),N')
;deps: (NTHD5)

(ci nthd5)
;(N<LENGTH U∧ALISTP U⊃CAR NTH(U,N)=NTH(DOM(U),N))⊃
;(N<LENGTH U∧ALISTP X.U⊃CAR NTH(U,N)=NTH(DOM(X.U),N'))
(label nthd_inductioncase)

(ue (phi3 |λu n.n<length u∧alistp u⊃car nth(u,n)=nth(dom(u),n)|) 
    doubleinduction1 nthd_basecase nthd_inductioncase)

(proof nthcdr_dom)
(assume |alistp u⊃nthcdr(dom(u),n)=dom(nthcdr(u,n))|)
(assume |alistp(x.u)|)
(derive |nthcdr(dom u,n)=dom nthcdr(u,n)| (-2 * alistfact2))
(derive |¬atom x∧atom car x∧alistp u| (-2 alistfact1))

(trw |nthcdr(dom((car x.cdr x).u),n')| (use -2 * mode: always)
     (nuse cons_car_cdr) (open dom))
;NTHCDR(DOM((CAR X.CDR X).U),N')=DOM(NTHCDR(U,N))

(rw * -2)
;NTHCDR(DOM(X.U),N')=DOM(NTHCDR(U,N))

(ci -5)
;ALISTP X.U⊃NTHCDR(DOM(X.U),N')=DOM(NTHCDR(U,N))

(ci -7)
;(ALISTP U⊃NTHCDR(DOM(U),N)=DOM(NTHCDR(U,N)))⊃
;(ALISTP X.U⊃NTHCDR(DOM(X.U),N')=DOM(NTHCDR(U,N)))

(ue (phi3 |λu n.alistp u⊃nthcdr(dom u,n)=dom nthcdr(u,n)|) doubleinduction1
    (open dom) *)
;∀U N.ALISTP U⊃NTHCDR(DOM(U),N)=DOM(NTHCDR(U,N))
(label nthcdr_dom)
(proof member_memberdom)
(trw |∀x y.x=y⊃car(x)=car(y)|)
;∀X Y.X=Y⊃CAR X=CAR Y

(ue ((x.|xa.y|)(y.|xa1.y1|)) *)
;XA.Y=XA1.Y1⊃XA=XA1

(ue (chi |λalist. member(xa1.y1,alist)⊃member(xa1,dom alist)|)
    alistinduction (open dom) (use * memberdef normal mode: always))
;∀ALIST.MEMBER(XA1.Y1,ALIST)⊃MEMBER(XA1,DOM(ALIST))
(label member_memberdom)
(proof invimage)


(assume |n≤length alist⊃disjoint(λm.invimage(m,alist),n)|)
(label invimage_indhyp)

(assume |n'≤length alist|)
(label invim0)

(derive |n<length alist| (* less_lesseqsucc))
(label invim1)

(assume |∀n.n<length alist⊃disjoint(λm.setseq(m),n')|)
(label invim2)

(assume |(un(λm.invimage(m,alist),n))(xv)∧(invimage(n,alist))(xv)|)
(label invim3)

(rw invim3 (use unionfact2 ue: ((setseq.|λm.invimage(m,alist)|)(n.n)) mode: exact))
;(∃K.K<N∧(INVIMAGE(K,ALIST))(X))∧(INVIMAGE(N,ALIST))(X)
(label invim4)
;deps: (INVIM3)

(define kw |kw<n∧(invimage(kw,alist))(xv)| invim4)
(label invim5)

(rw invim4 (part 2 (open invimage)))
;(∃K.K<N∧(INVIMAGE(K,ALIST))(xv))∧ATOM xv∧(∃Y.MEMBER(xv.Y,ALIST)∧(SETSEQ(N))(Y))
;deps: (INVIM3)

(define yw1 |member(xv.yw1,alist)∧(setseq n)(yw1)| *)
(label invim6)

(rw invim5 (open invimage))
;KW<N∧ATOM X∧(∃Y.MEMBER(X.Y,ALIST)∧(SETSEQ(KW))(Y))
(label invim7)
;deps: (INVIM3)

(define yw2 |member(xv.yw2,alist)∧(setseq kw)(yw2)| *)
(label invim8)

;yw1 and yw2 are different S-expressions, since they belong to different sets
;of the disjoint sequence setseq

(derive |∃m.m<n∧(setseq m)(yw2)| (invim7 invim8))

(rw * (use unionfact2 ue: ((setseq.setseq)(n.n)) mode: exact direction: reverse))
;(UN(λM.SETSEQ(M),N))(YW2)
(label invim9)

(derive |disjoint(λm.setseq(m),n')| (invim1 invim2))
;deps: (INVIM1 INVIM2)

(rw * (open disjoint disj_pair intersection emptyp))
;DISJOINT(λM.SETSEQ(M),N)∧(∀XV.¬((UN(λM.SETSEQ(M),N))(XV)∧(SETSEQ(N))(XV)))
(label invim10)

(assume |yw1=yw2|)
(label invim11)

(derive |false| (invim6 invim9 invim10 invim11))

(ci invim11)
;¬YW1=YW2
;deps: (INVIM1 INVIM2 INVIM3)
(label invim12)

;therefore xv.yw1 and xv.yw2 are different components of alist

(trw |∀x y.x=y⊃cdr(x)=cdr(y)|)
;∀X Y.X=Y⊃CAR X=CAR Y

(ue ((x.|xv.yw1|)(y.|xv.yw2|)) * invim12)
;¬X.YW1=X.YW2
(label invim13)
;deps: (INVIM1 INVIM2 INVIM3)
 
(derive |∃n.n<length alist∧nth(alist,n)=xv.yw1| (member_nth invim6))
(label invim14)

(derive |∃n.n<length alist∧nth(alist,n)=xv.yw2| (member_nth invim8))
(label invim15)

(define iw |iw<length alist∧nth(alist,iw)=xv.yw1| invim14)
(label invim16)

(define jw |jw<length alist∧nth(alist,jw)=xv.yw2| invim15)
(label invim17)

(assume |iw=jw|)
(label invim18)

(trw |xv.yw1=xv.yw2| (use invim16 invim17 mode: always direction: reverse)
                     (use invim18 mode: exact))
;X.YW1=X.YW2
;deps: (INVIM3 INVIM18)

(derive |false| (* invim13))

(ci invim18)
;¬IW=JW
;deps: (INVIM1 INVIM2 INVIM3)
(label invim19)

;but dom alist is injective

(assume |inj(dom alist)|)
(label invim20)

(rw invim20 (use injdef mode: exact))
;∀N M.N<LENGTH (DOM(ALIST))∧M<LENGTH (DOM(ALIST))∧
;     NTH(DOM(ALIST),N)=NTH(DOM(ALIST),M)⊃N=M
;deps: (INVIM20)

(derive |iw<length dom(alist)∧jw<length dom(alist)| (invim16 invim17 domlength))

(derive |nth(dom(alist),iw)=nth(dom(alist),jw)⊃iw=jw| (-2 *))
(label invim21)

(ue ((u.alist)(n.iw)) nth_dom (use invim16 mode: always))
;X=NTH(DOM(ALIST),IW)
;deps: (INVIM3)

(ue ((u.alist)(n.jw)) nth_dom (use invim17 mode: always))
;X=NTH(DOM(ALIST),JW)
;deps: (INVIM3)

(rw invim21 (use * -2 mode: exact direction: reverse))
;IW=JW
;deps: (INVIM3 INVIM20)

(rw * invim19)
;FALSE
;deps: (INVIM1 INVIM2 INVIM3 INVIM20)

(ci invim3)
;¬((UN(λM.INVIMAGE(M,ALIST),N))(X)∧(INVIMAGE(N,ALIST))(X))
;deps: (INVIM1 INVIM2 INVIM20)
(label invim22)

(trw |n≤length alist| (open lesseq) invim1)
(derive |disjoint(λm.invimage(m,alist),n)| (* invimage_indhyp))
(label invim23)
 
(trw |disjoint(λm.invimage(m,alist),n')| 
     (open disjoint disj_pair intersection emptyp) invim22 invim23)
;DISJOINT(λM.INVIMAGE(M,ALIST),N')
;deps: (INVIMAGE_INDHYP INVIM0 INVIM2 INVIM20)

(ci invim0)
;N'≤LENGTH ALIST⊃DISJOINT(λM.INVIMAGE(M,ALIST),N')
;deps: (INVIMAGE_INDHYP INVIM2 INVIM20)

(ci invimage_indhyp)
;(N≤LENGTH ALIST⊃DISJOINT(λM.INVIMAGE(M,ALIST),N))⊃
;(N'≤LENGTH ALIST⊃DISJOINT(λM.INVIMAGE(M,ALIST),N'))
;deps: (INVIM2 INVIM20)

(ue (a |λn.n≤length alist⊃disjoint(λm.invimage(m,alist),n)|) proof_by_induction
    * (part 1#1(open disjoint)))
;∀N.N≤LENGTH ALIST⊃DISJOINT(λM.INVIMAGE(M,ALIST),N)
;deps: (INVIM2 INVIM20)

(ci (invim2 invim20))
;(∀N.N<LENGTH ALIST⊃DISJOINT(λM.SETSEQ(M),N'))∧INJ(DOM(ALIST))⊃
;(∀N.N≤LENGTH ALIST⊃DISJOINT(λM.INVIMAGE(M,ALIST),N))


(proof double_alistinduction)
(axiom |∀u n.alistp u∧n<length u⊃cdr nth(u,n)=nth(range(u),n)|)
(label nth_range)

(axiom |∀u n.alistp u∧n<length u⊃car nth(u,n)=nth(dom(u),n)|)
(label nth_dom)

(assume |∀alist n xa y.chi3(nil,n)∧chi3(alist,0)∧
                       (chi3(alist,n)⊃chi3((xa.y).alist,n'))|)
(label dalistassume)
                                                                       
(ue (chi |λalist.∀n.chi3(alist,n)|) alistinduction
    (use dalistassume) 
    (use proof_by_induction ue: ((a.|λn.chi3((xa.y).alist,n)|)) ))
;∀ALIST N.CHI3(ALIST,N)
;deps: (DALISTASSUME)
 
(ci dalistassume)
;(∀ALIST N XA Y.CHI3(NIL,N)∧CHI3(ALIST,0)∧
;               (CHI3(ALIST,N)⊃CHI3((XA.Y).ALIST,N')))⊃(∀ALIST N.CHI3(ALIST,N))
(label double_alistinduction1)


(proof appalist_nth)

(ue (chi |λalist.uniqueness(dom(alist))⊃
                 cdr assoc(car dom(alist),alist)=car range(alist)|)
    alistinduction (open uniqueness assoc dom range))
;∀ALIST.UNIQUENESS(DOM(ALIST))⊃CDR ASSOC(CAR DOM(ALIST),ALIST)=CAR RANGE(ALIST)
(label a_n_base)

;a negative rewriter for the inductive step

(assume |n<length dom(alist)∧xa=nth(dom alist,n)|)
(label a_n1)

(trw |member(xa,dom alist)| nthmember (use * mode: always))
;MEMBER(XA,DOM(ALIST))
;deps: (A_N1)

(ci a_n1)
;N<LENGTH (DOM(ALIST))∧XA=NTH(DOM(ALIST),N)⊃MEMBER(XA,DOM(ALIST))
(label a_n2)

(assume |¬member(xa,dom alist)|)
(label a_n3)

(derive |∀n.n<length dom(alist)⊃nth(dom alist,n)≠xa| (* a_n2))
;deps: (A_N3)

(ci a_n3)
;¬MEMBER(XA,DOM(ALIST))⊃(∀N.N<LENGTH (DOM(ALIST))⊃¬NTH(DOM(ALIST),N)=XA)
(label a_n4)

;we are ready 

(ue (chi3 |λalist n.uniqueness dom(alist) ∧ n<length dom(alist) ⊃ 
                    appalist(nth(dom alist,n),alist)= nth(range alist,n)|)
    double_alistinduction1 atom_nth a_n_base 
    (part 1 (open appalist assoc dom range uniqueness))(use a_n4 mode: always))
;∀ALIST N.UNIQUENESS(DOM(ALIST))∧N<LENGTH (DOM(ALIST))⊃
;         APPALIST(NTH(DOM(ALIST),N),ALIST)=NTH(RANGE(ALIST),N)